package cn.demo.generator.domain;

import cn.demo.common.constant.CommonConstants;
import cn.demo.common.constant.GenConstants;
import cn.demo.common.core.domain.BaseEntity;
import cn.demo.common.mybatisFlex.MyInsertListener;
import cn.demo.common.mybatisFlex.MyUpdateListener;
import cn.demo.common.utils.StringUtils;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import com.mybatisflex.core.constant.SqlOperator;
import com.mybatisflex.core.query.SqlOperators;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.apache.commons.lang3.ArrayUtils;

/**
 * 代码生成业务字段表 gen_table_column
 *
 * @author ruoyi
 */
@EqualsAndHashCode(callSuper = true)
@Data
@Table(value = "gen_table_column",onInsert = MyInsertListener.class,onUpdate = MyUpdateListener.class)
public class GenTableColumn extends BaseEntity {
    private static final long serialVersionUID = 1L;

    /**
     * 编号
     */
    @Id
    private String columnId;

    /**
     * 归属表编号
     */
    private String tableId;

    /**
     * 列名称
     */
    private String columnName;

    /**
     * 列描述
     */
    private String columnComment;

    /**
     * 列类型
     */
    private String columnType;

    /**
     * JAVA类型
     */
    private String javaType;

    /**
     * JAVA字段名
     */
    @NotBlank(message = "Java属性不能为空")
    private String javaField;

    /**
     * 是否主键（1是）
     */
    private Integer isPk;

    /**
     * 是否自增（1是）
     */
    private Integer isIncrement;

    /**
     * 是否必填（1是）
     */
    private Integer isRequired;

    /**
     * 是否为插入字段（1是）
     */
    private Integer isInsert;

    /**
     * 是否编辑字段（1是）
     */
    private Integer isEdit;

    /**
     * 是否列表字段（1是）
     */
    private Integer isList;

    /**
     * 是否查询字段（1是）
     */
    private Integer isQuery;

    /**
     * 查询方式（EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围）
     */
    private String queryType;

    /**
     * 显示类型（input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本）
     */
    private String htmlType;

    /**
     * 字典类型
     */
    private String dictType;

    /**
     * 排序
     */
    private Integer sort;

    public String getCapJavaField() {
        return StringUtils.capitalize(javaField);
    }

    public boolean isPk() {
        return isYes(this.isPk);
    }
    public boolean isIncrement() {
        return isYes(this.isIncrement);
    }

    public boolean isRequired() {
        return isYes(this.isRequired);
    }

    public boolean isInsert() {
        return isYes(this.isInsert);
    }


    public boolean isEdit() {
        return isYes(this.isEdit);
    }

    public boolean isList() {
        return isYes(this.isList);
    }

    public boolean isQuery() {
        return isYes(this.isQuery);
    }

    public boolean isYes(Integer key) {
        return CommonConstants.YES.equals(key);
    }

    public boolean isSuperColumn() {
        return isSuperColumn(this.javaField);
    }

    public static boolean isSuperColumn(String javaField) {
        return StringUtils.equalsAnyIgnoreCase(javaField, ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY));
    }

    public boolean isUsableColumn() {
        return isUsableColumn(javaField);
    }

    public static boolean isUsableColumn(String javaField) {
        // isSuperColumn()中的名单用于避免生成多余Domain属性，若某些属性在生成页面时需要用到不能忽略，则放在此处白名单
        return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark");
    }

    public String readConverterExp() {
        String remarks = StringUtils.substringBetween(this.columnComment, "(", ")");
        if (StringUtils.isNotEmpty(remarks) && !remarks.startsWith("字典:")) {
            StringBuffer sb = new StringBuffer();
            if (StringUtils.isNotEmpty(remarks)) {
                for (String value : remarks.split(" ")) {
                    if (StringUtils.isNotEmpty(value)) {
                        Object startStr = value.subSequence(0, 1);
                        String endStr = value.substring(1);
                        sb.append(startStr).append("=").append(endStr).append(",");
                    }
                }
                return sb.deleteCharAt(sb.length() - 1).toString();
            }
        }
        return "";
    }

    // 自定义字段的 SQL 操作符
    @JsonIgnore
    public static final SqlOperators operators = SqlOperators.of()
            .set(GenTableColumn::getColumnName, SqlOperator.LIKE)
            .set(GenTableColumn::getColumnComment, SqlOperator.LIKE);
}
